/*
 * DatosCrearUniverso.cpp
 *
 *  Created on: 27/02/2010
 *      Author: San Martín, Matías I.
 */

#include "DatosCrearUniverso.h"

#include <iostream>
#include <sstream>

#include "../../../Framework/Common/File.h"

namespace aplicacion {

std::ostream &operator<<( std::ostream &stream, const DatosCrearUniverso &obj )
{
	return stream << "DatosCrearUniverso("<< obj.getTamanio() <<"):"
			<< obj._params._idUniverso << "|"
			<< obj._params._maxPlanetas << "|"
			<< obj._params._minPlanetas << "|"
			<< obj._params._timeout;
}

std::string DatosCrearUniverso::toString() const
{
	std::stringstream stm;
	stm << *this;
	return stm.str();
}

DatosCrearUniverso::DatosCrearUniverso() {
	this->setTamanio(sizeof(_params._idUniverso) +
					sizeof(_params._maxPlanetas) +
					sizeof(_params._minPlanetas) +
					sizeof(_params._timeout));

}

DatosCrearUniverso::~DatosCrearUniverso() {
}

/**
 * @throws IOExcepcion @see File#writeAll
 */
size_t DatosCrearUniverso::save (int fd) const
{
	size_t guardar = 0;

	guardar += sizeof(_params._idUniverso);
	File::writeAll(fd,&_params._idUniverso,sizeof(_params._idUniverso));

	guardar += sizeof(_params._maxPlanetas);
	File::writeAll(fd,&_params._maxPlanetas,sizeof(_params._maxPlanetas));

	guardar += sizeof(_params._minPlanetas);
	File::writeAll(fd,&_params._minPlanetas,sizeof(_params._minPlanetas));

	guardar += sizeof(_params._timeout);
	File::writeAll(fd,&_params._timeout,sizeof(_params._timeout));

	return guardar;
}

/**
 * @throws IOExcepcion @see File#writeAll
 */
size_t DatosCrearUniverso::load (int fd)
{
	size_t cargar = 0;

	cargar += sizeof(_params._idUniverso);
	File::readAll(fd,&_params._idUniverso,sizeof(_params._idUniverso));

	cargar += sizeof(_params._maxPlanetas);
	File::readAll(fd,&_params._maxPlanetas,sizeof(_params._maxPlanetas));

	cargar += sizeof(_params._minPlanetas);
	File::readAll(fd,&_params._minPlanetas,sizeof(_params._minPlanetas));

	cargar += sizeof(_params._timeout);
	File::readAll(fd,&_params._timeout,sizeof(_params._timeout));

	this->setTamanio(cargar);
	return cargar;
}

/**
 * @see middleware::io::SerializableToArray#saveToArray(int)
 */
size_t DatosCrearUniverso::saveToArray (uint8_t* arr) const {
	uint8_t* arr_original = arr;

	//se guardan los datos especificos de esta clase
	memcpy(arr, &_params._idUniverso, sizeof(_params._idUniverso));
	arr += sizeof(_params._idUniverso);

	memcpy(arr, &_params._maxPlanetas, sizeof(_params._maxPlanetas));
	arr += sizeof(_params._maxPlanetas);

	memcpy(arr, &_params._minPlanetas, sizeof(_params._minPlanetas));
	arr += sizeof(_params._minPlanetas);

	memcpy(arr, &_params._timeout, sizeof(_params._timeout));
	arr += sizeof(_params._timeout);

	return arr - arr_original;
}

/**
 * @see middleware::io::SerializableToArray#loadFromArray(int)
 */
size_t DatosCrearUniverso::loadFromArray (const uint8_t* arr) {
	const uint8_t* arr_original = arr;

	memcpy(&_params._idUniverso, arr, sizeof(_params._idUniverso));
	arr += sizeof(_params._idUniverso);

	memcpy(&_params._maxPlanetas, arr, sizeof(_params._maxPlanetas));
	arr += sizeof(_params._maxPlanetas);

	memcpy(&_params._minPlanetas, arr, sizeof(_params._minPlanetas));
	arr += sizeof(_params._minPlanetas);

	memcpy(&_params._timeout, arr, sizeof(_params._timeout));
	arr += sizeof(_params._timeout);

	size_t cargar = arr - arr_original;
	this->setTamanio(cargar);

	return cargar;
}

}//namespace aplicacion

